package pl.edu.pw.elka.tinyrepo.common;

import java.net.Socket;


//FIXME poprawic zaleznosc z oddzielnym przechowywanie request line

/**
 * Interfejs dla handlerow zapytan.
 * UWAGA: handler w serwerze otrzymuje dostep do strumienia BEZ LINII REQUEST LINE
 * dlatego aby otrzymac request line nalezy odwolywac sie do getRequestLine znajdujacej sie w klasie Request
 * a nie do strumienia z socketa !
 * Zaklada sie, ze prawidlowo przygotowany RequestHandler ma prawidlowo
 * ustawiony Request z prawidlowo ustawionym requestLine !
 * @author Piotr Jarosik
 */
public interface RequestHandler extends Runnable, Cloneable {
   /**
    * Zapamietuje socket do
    * pozniejszego odbierania i wysylania danych.
    * Uwaga - socket nie posiada juz pierwszej linii zapytania (tzn. request line) !
    * 
    * @param incomming
    */
   void setSocket(Socket incomming);
   
   /**
    * Tworzy gleboka kopie handlera. Jest to szczegolnie potrzebne
    * np w klasie serwera, gdyz obiekty RequestHandlera
    * moga przechowywac istotne informacje dla obecnego stanu
    * aplikacji (jak np. deskr. rep.),
    * dlatego handler jest przechowywany jako prototyp, jednak
    * trzeba podac dla handlera konkretnego zapytania
    * socket tego zapytania, co musi byc wykonane przez setSocket w glownej
    * petli, dlatego musza byc oddzielne obiekty dla tego samego prototypu
    * handlera. UWAGA: to nie jest Object.clone - tamten to jest potegocony troche.
    * 
    * @return gleboka kopia
    */
   RequestHandler copy();
   
   /**
    * Ustawia request, ktorego dotyczy dany dany handler.
    * UWAGA: request ten posiada juz ustawiony request line !
    * @param r - ustawiany request.
    */
   void setRequest(Request r);
   
   /**
    * Getter requestu.
    * 
    * @return request.
    */
   Request getRequest(); 
}
